package com.feishi.core.util.common.math;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: caixq
 * Date: 2018-12-27
 * Time: 下午5:43
 */
public class Linear {
    /**
     * 交换两个参数
     * @param a
     * @param b
     */
    public void swap(int a,int b){
        int t=0;
        t=a;
        a=b;
        b=t;
    }
    public static void main(String[] args) {
        //获取方程个数和未知数个数
        Scanner sr=new Scanner(System.in);
        System.out.println("请输入方程个数:");
        int equationNum=sr.nextInt();
        System.out.println("请输入未知数个数：");
        int unknownNum=sr.nextInt();
        System.out.println("您输入的方程个数为："+equationNum);
        System.out.println("您输入的未知数个数为"+unknownNum);
        int[][] fangcheng=new int[equationNum][unknownNum+1];
        for(int i=0;i<equationNum;i++){
            System.out.println("请输入第"+(i+1)+"个方程的未知数系数和值，系数之间用;隔开");
            String xishu=sr.next();
            String [] as = xishu.split(";");
            for(int j=0;j<unknownNum+1;j++){
                fangcheng[i][j]=Integer.parseInt(as[j]);
            }
        }
        System.out.println("此时的方程为：");
        for(int i=0;i<equationNum;i++){
            for(int j=0;j<unknownNum+1;j++){
                if(j != unknownNum){
                    System.out.print(fangcheng[i][j]+"  ");
                }else{
                    System.out.print("|"+fangcheng[i][j]);
                }
            }
            System.out.println();
        }
        if(equationNum>unknownNum){
            //无解
            System.out.println("方程无解");
        }else{
            //有解
            for(int i=0;i<equationNum-1;i++){
                //选取主元素
                //如果主元素为0，则找该列不为0的行交换
                if(fangcheng[i][i]==0){
                    //查找该列下不为0的行
                    for(int j=i+1;j<equationNum;j++){
                        if(fangcheng[j][i] !=0){
                            //交换两行
                            for(int k=i;k<equationNum;k++){
                                for(int m=0;m<unknownNum+1;m++){
                                    //交换操作
                                    int temp;
                                    temp=fangcheng[k][m];
                                    fangcheng[k][m]=fangcheng[j][m];
                                    fangcheng[j][m]=temp;
                                }
                            }
                            break;
                        }
                    }
                    System.out.println("交换后的方程为：");
                    for(int p=0;p<equationNum;p++){
                        for(int q=0;q<unknownNum+1;q++){
                            if(q==unknownNum){
                                System.out.print("|"+fangcheng[p][q]);
                            }else{
                                System.out.print(fangcheng[p][q]+"  ");
                            }
                        }
                        System.out.println();
                    }
                }
                System.out.println("此时的主元素为："+fangcheng[i][i]);
                //进行消元操作,循环当前行下面的所有行，进行减法运算
                for(int i1=i+1;i1<equationNum;i1++){
                    float gys=fangcheng[i][i]/fangcheng[i1][i];
                    System.out.println("公约数为："+gys);
                    for(int i2=i;i2<unknownNum+1;i2++){
                        //为每一行从新赋值
                        if(fangcheng[i1][i2]!=0){
                            fangcheng[i1][i2]=(int) (fangcheng[i1][i2]*gys-fangcheng[i][i2]);
                        }
                    }
                }
                System.out.println("计算后的上三角为：");
                for(int p=0;p<equationNum;p++){
                    for(int q=0;q<unknownNum+1;q++){
                        if(q==unknownNum){
                            System.out.print("|"+fangcheng[p][q]);
                        }else{
                            System.out.print(fangcheng[p][q]+"  ");
                        }
                    }
                    System.out.println();
                }
                //消元完成进行反转，当equationNum=unknownNum满秩的时候，有唯一解直接求解，当equationNum<unknownNum，有无数解；
            }
        }
    }
}